package com.example.demo.framework.util;

import java.io.File;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.sf.csim.express.service.CallExpressServiceTools;

public class SfUtil {

	final static String reqURL = "https://bsp-oisp.sf-express.com/bsp-oisp/sfexpressService";

	final static String clientCode = "AH";// 此处替换为您在丰桥平台获取的顾客编码

	final static String checkword = "ij1W3FtDyYucXTc7XsI12e5bMFMByFX4";// 此处替换为您在丰桥平台获取的校验码

	final static String PATH_ORDER = "src\\main\\resources\\order.xml";

	final static String PATH_ORDER_QUERY = "src\\main\\resources\\order_query.xml";

	final static String PATH_ORDER_CONFIRM = "src\\main\\resources\\order_confirm.xml";

	final static String PATH_ROUTE_QUERYBYMAILNO = "src\\main\\resources\\route_queryByMailNo.xml";

	final static String PATH_ROUTE_QUERYBYORDERNO = "src\\main\\resources\\route_queryByOrderNo.xml";

	/**
	 * 下单
	 * 
	 * @param orderid
	 * @param j_company
	 *            寄件方公司名称，如果需要生成电子运单，则为必填
	 * @param j_contact
	 *            寄件方联系人，如果需要生成电子运单，则为必填
	 * @param j_tel
	 *            寄件方联系人，如果需要生成电子运单，则为必填
	 * @param j_province
	 *            寄件方所在省份 字段填写要求：必须是标准的省名称称谓 如：广东省，如果是直辖市，请直接传北京、上海等。
	 * @param j_city
	 *            寄件方所在省份 字段填写要求：必须是标准的省名称称谓 如：广东省，如果是直辖市，请直接传北京、上海等。
	 * @param j_county
	 *            寄件方所在省份 字段填写要求：必须是标准的省名称称谓 如：广东省，如果是直辖市，请直接传北京、上海等。
	 * @param j_address
	 *            寄件方详细地址，包括省市区，示例：“广东省深圳市福田区新洲十一街万基商务大厦10楼” ，如果需要生成电子运单，则为必填。
	 * @param d_company
	 *            到件方公司名称
	 * @param d_contact
	 *            到件方联系人
	 * @param d_tel
	 *            到件方联系电话
	 * @param d_province
	 *            到件方所在省份，必须是标准的省名称称谓 如：广东省，如果是直辖市，请直接传北京、上海等。如果此字段与d_city字段都有值，
	 *            系统则直接使用这两个值而不是通过对d_address进行地址识别获取。为避免地址识别不成功的风险，建议传输此字段
	 * @param d_city
	 *            到件方所在城市名称，必须是标准的城市称谓
	 *            如：深圳市，如果是直辖市，请直接传北京（或北京市）、上海（或上海市）等。如果此字段与d_province字段都有值，
	 *            顺丰系统则直接使用这两个值而不是对d_address进行地址识别获取。为避免地址识别不成功的风险，建议传输此字段。
	 * @param d_county
	 *            到件方所在县/区，必须是标准的县/区称谓，示例：福田区
	 * @param d_address
	 *            到件方详细地址，如果不传输d_province/d_city字段，此详细地址需包含省市信息，以提高地址识别的成功率，示例：“
	 *            广东省深圳市福田区新洲十一街万基商务大厦10楼”
	 * @return
	 */
	public static String sfOrder(String orderid, String j_company, String j_contact, String j_tel, String j_province,
			String j_city, String j_county, String j_address, String d_company, String d_contact, String d_tel,
			String d_province, String d_city, String d_county, String d_address) {
		String reqXml = "";
		SAXReader reader = new SAXReader();
		Document doc = null;
		try {
			doc = reader.read(new File(PATH_ORDER));
			Element root = doc.getRootElement();
			Element orderElement = root.element("Body").element("Order");
			orderElement.attribute("orderid").setValue(orderid);
			orderElement.attribute("j_company").setValue(j_company);
			orderElement.attribute("j_contact").setValue(j_contact);
			orderElement.attribute("j_tel").setValue(j_tel);
			orderElement.attribute("j_province").setValue(j_province);
			orderElement.attribute("j_city").setValue(j_city);
			orderElement.attribute("j_county").setValue(j_county);
			orderElement.attribute("j_address").setValue(j_address);
			orderElement.attribute("d_company").setValue(d_company);
			orderElement.attribute("d_contact").setValue(d_contact);
			orderElement.attribute("d_tel").setValue(d_tel);
			orderElement.attribute("d_province").setValue(d_province);
			orderElement.attribute("d_city").setValue(d_city);
			orderElement.attribute("d_county").setValue(d_county);
			orderElement.attribute("d_address").setValue(d_address);

			reqXml = root.asXML();
			System.out.println(reqXml);
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		String respXml = response(reqXml);
		return respXml;
	}

	/**
	 * 查询订单结果
	 * 
	 * @return
	 */
	public static String sfOrderQuery(String orderid) {
		String reqXml = "";
		SAXReader reader = new SAXReader();
		Document doc = null;
		try {
			doc = reader.read(new File(PATH_ORDER_QUERY));
			Element root = doc.getRootElement();
			root.element("Body").element("OrderSearch").attribute("orderid").setValue(orderid);
			reqXml = root.asXML();
			System.out.println(reqXml);
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		String respXml = response(reqXml);
		return respXml;
	}

	/**
	 * 订单取消
	 * 
	 * @return
	 */
	public static String sfOrderConfirm(String orderid) {
		String reqXml = "";
		SAXReader reader = new SAXReader();
		Document doc = null;
		try {
			doc = reader.read(new File(PATH_ORDER_CONFIRM));
			Element root = doc.getRootElement();
			root.element("Body").element("OrderConfirm").attribute("orderid").setValue(orderid);
			reqXml = root.asXML();
			System.out.println(reqXml);
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		String respXml = response(reqXml);
		return respXml;
	}

	/**
	 * 路由查询-通过运单号
	 * 
	 * @return
	 */
	public static String sfRouteQueryByMailNo(String mailno) {
		String reqXml = "";
		SAXReader reader = new SAXReader();
		Document doc = null;
		try {
			doc = reader.read(new File(PATH_ROUTE_QUERYBYMAILNO));
			Element root = doc.getRootElement();
			root.element("Body").element("RouteRequest").attribute("tracking_number").setValue(mailno);
			reqXml = root.asXML();
			System.out.println(reqXml);
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		String respXml = response(reqXml);
		return respXml;
	}

	/**
	 * 路由查询-通过订单号
	 * 
	 * @return
	 */
	public static String sfRouteQueryByOrderNo(String orderid) {
		String reqXml = "";
		SAXReader reader = new SAXReader();
		Document doc = null;
		try {
			doc = reader.read(new File(PATH_ROUTE_QUERYBYORDERNO));
			Element root = doc.getRootElement();
			root.element("Body").element("RouteRequest").attribute("tracking_number").setValue(orderid);
			reqXml = root.asXML();
			System.out.println(reqXml);
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		String respXml = response(reqXml);
		return respXml;
	}

	@SuppressWarnings("static-access")
	private static String response(String reqXml) {
		CallExpressServiceTools client = CallExpressServiceTools.getInstance();
		String myReqXML = reqXml.replace("SLKJ2019", clientCode);
		System.out.println("请求报文：" + myReqXML);
		String respXml = client.callSfExpressServiceByCSIM(reqURL, myReqXML, clientCode, checkword);
		if (respXml != null) {
			System.out.println("--------------------------------------");
			System.out.println("返回报文: " + respXml);
			System.out.println("--------------------------------------");
		}
		return respXml;
	}

	public static void main(String[] args) {
		SfUtil.sfRouteQueryByOrderNo("QIAO-20180104001");
	}
}
